package org.dromara.workflow.flowable.cmd;

import org.dromara.common.core.exception.ServiceException;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.task.service.HistoricTaskService;
import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntity;

import java.util.Date;
import java.util.List;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：修改流程历史
 */
/**
 * 更新打招呼任务实例命令类
 * 该类实现了Command接口，指定执行更新操作的结果类型为Boolean
 */
public class UpdateHiTaskInstCmd implements Command<Boolean> {

    /**
     * 任务ID列表，用于存储与特定任务相关的标识符
     */
    private final List<String> taskIds;

    /**
     * 流程定义ID，标识流程的具体实现版本，用于区分不同流程的结构和规则
     */
    private final String processDefinitionId;

    /**
     * 流程实例ID，每个流程实例对应一个唯一的标识符，用于追踪和管理具体的流程执行实例
     */
    private final String processInstanceId;

    /**
     * 更新高优先级任务实例命令类构造函数
     *
     * @param taskIds 高优先级任务实例的ID列表，用于标识需要更新的任务
     * @param processDefinitionId 流程定义ID，表示任务所属的流程定义
     * @param processInstanceId 流程实例ID，表示任务所属的具体流程实例
     */
    public UpdateHiTaskInstCmd(List<String> taskIds, String processDefinitionId, String processInstanceId) {
        this.taskIds = taskIds;
        this.processDefinitionId = processDefinitionId;
        this.processInstanceId = processInstanceId;
    }

    /**
     * 执行命令，更新历史任务实例的信息
     *
     * @param commandContext 命令上下文，用于获取历史任务服务和其他必要信息
     * @return Boolean 返回执行结果，如果执行成功返回true
     */
    @Override
    public Boolean execute(CommandContext commandContext) {
        try {
            // 获取历史任务服务
            HistoricTaskService historicTaskService = CommandContextUtil.getHistoricTaskService();
            // 遍历任务ID列表，更新每个任务的历史实例信息
            for (String taskId : taskIds) {
                // 获取指定ID的历史任务实例
                HistoricTaskInstanceEntity historicTask = historicTaskService.getHistoricTask(taskId);
                if (historicTask != null) {
                    // 更新历史任务实例的流程定义ID和流程实例ID
                    historicTask.setProcessDefinitionId(processDefinitionId);
                    historicTask.setProcessInstanceId(processInstanceId);
                    // 更新历史任务实例的创建时间
                    historicTask.setCreateTime(new Date());
                    // 更新历史任务实例，并提交更改
                    CommandContextUtil.getHistoricTaskService().updateHistoricTask(historicTask, true);
                }
            }
            return true;
        } catch (Exception e) {
            // 如果执行过程中发生异常，抛出自定义服务异常
            throw new ServiceException(e.getMessage());
        }
    }
}
